package fsmsim.kernel;

import java.util.List;

import org.jdom.Document;
import org.jdom.Element;

public class AFD extends FSM{

	protected AFD(){
		super("",800,600);
	}
	public AFD(String alfabeto){
		this();
	}

	@Override
	public void addTransicion(Estado origen, Estado destino, String regla) {
		// FIXME : Falta verificar la regla
		super.addTransicion(new AFDTransicion(origen, destino, regla.charAt(0)));
	}
	
	
	class AFDTransicion extends Transicion{
		public AFDTransicion(Estado origen,Estado destino,char leido){
			super(origen,destino,leido,FSM.SIMB_COMODIN,FSM.SIMB_NULO,FSM.SIMB_NULO,'R' );
		}
		public String toString(){
			return _readCinta+"";
		}
	}


	@Override
	public String getTipo() {
		return "AFD";
	}

	@Override
	public void parse(Document documento) {
		try{
		Element m= documento.getRootElement();
		
		this._ancho= m.getAttribute("width").getIntValue();
		this._alto= m.getAttribute("height").getIntValue();
		// FIXME : Falta por cargar el alfabeto.
		this._estados.clear();
		this._inicio=null;
		List l = m.getChild("states").getChildren("state");
		for(Object e:l){
			Element s=(Element) e;
			Estado x= addEstado(s.getAttributeValue("name"), s.getAttribute("x").getIntValue(), s.getAttribute("y").getIntValue());
			if(s.getAttribute("initial").getBooleanValue())
				setInicial(x);
			if(s.getAttribute("final").getBooleanValue())
				setEstadoFinal(x, true);
		}
		l=m.getChild("transitions").getChildren("transition");
		for(Object x:l){
			Element t=(Element)x;
			AFDTransicion ts= new AFDTransicion( getEstado(t.getAttributeValue("origin")) , getEstado( t.getAttributeValue("destination")), t.getAttributeValue("taperead").charAt(0));
			ts._angulo= t.getAttribute("angle").getFloatValue();
			ts._distancia= t.getAttribute("distance").getIntValue();
			ts.updateLocation();
			addTransicion(ts);
		}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}
